-- 后台用户表
CREATE TABLE admins (
    id SERIAL NOT NULL PRIMARY KEY,
    name VARCHAR(20) NOT NULL DEFAULT '',           -- 管理员名称
    password CHAR(32) NOT NULL DEFAULT '',          -- 登录密码
    role_id INT NOT NULL DEFAULT 0,                 -- 角色编号
    secret CHAR(32) NOT NULL DEFAULT '',            -- 检验密码
    last_login TIMESTAMPTZ NOT NULL DEFAULT NOW(),  -- 最后登录时间
    login_count INT NOT NULL DEFAULT 0,             -- 登录次数
    last_ip INET,                                   -- 最后登录IP
    status SMALLINT NOT NULL DEFAULT 0,             -- 状态, 0: 停用; 1: 启用;
    created TIMESTAMPTZ NOT NULL DEFAULT NOW(),     -- 添加时间
    updated TIMESTAMPTZ NOT NULL DEFAULT NOW(),     -- 修改时间
    sort INT NOT NULL DEFAULT 0,                    -- 排序
    remark VARCHAR(200) NOT NULL DEFAULT '',        -- 备注
    FOREIGN KEY (role_id) REFERENCES admin_roles(id)
);

-- 索引
CREATE UNIQUE INDEX ON admins(name);

-- 管理员登录
CREATE OR REPLACE FUNCTION admin_login(p_name VARCHAR, p_password VARCHAR, v_ip VARCHAR)
    RETURNS TEXT
AS $$
    DECLARE
        r admins%ROWTYPE;
        v_real_password VARCHAR;
        v_secret VARCHAR;
        v_new_password VARCHAR;
    BEGIN
        SELECT * INTO r FROM admins WHERE name = p_name LIMIT 1;
        IF r IS NULL THEN  -- 如果没有找到到记录
            RETURN '用户名称或者登录密码有误: ' + p_name;
        ELSE
            v_real_password = encrypt_password_admin(p_password, r.secret); -- 真正的密码
            IF v_real_password <> r.password THEN -- 如果密码不正确
                RETURN '用户名称或者用户密码错误';
            ELSEIF r.status = 0 THEN
                RETURN '用户账号已被停用';
            END iF;
        END IF;

        v_secret = secret_string();
        v_new_password = encrypt_password_admin(p_password, v_secret);
        UPDATE users
        SET
            secret = v_secret,              -- 新的密盐
            password = v_new_password,      -- 密码
            login_count = login_count + 1,  -- 登录次数
            last_login = NOW(),             -- 上次登录时间
            last_ip = v_ip::inet,           -- 上次登录ip
            updated = NOW()                 -- 更新时间
        WHERE id = r.id;
        RETURN 'ok';
    END;
$$ LANGUAGE plpgsql;

-- 生成初始密码
CREATE OR REPLACE FUNCTION user_login_init()
    RETURNS TABLE(secret VARCHAR, password VARCHAR)
AS $$
    DECLARE
        v_secret VARCHAR;
        v_password VARCHAR;
    BEGIN
        v_secret = secret_string();
        v_password = password_with_secret('qwe123', v_secret);
        UPDATE users
        SET
            secret = v_secret,
            password = v_password
        WHERE name = 'admin';
        RETURN QUERY SELECT v_secret, v_password;
    END;
$$ LANGUAGE plpgsql;
